//找出数组中重复的数字。 
//
// 
//在一个长度为 n 的数组 nums 里的所有数字都在 0～n-1 的范围内。数组中某些数字是重复的，但不知道有几个数字重复了，也不知道每个数字重复了几次。请
//找出数组中任意一个重复的数字。 
//
// 示例 1： 
//
// 输入：
//[2, 3, 1, 0, 2, 5, 3]
//输出：2 或 3 
// 
//
// 
//
// 限制： 
//
// 2 <= n <= 100000 
// Related Topics 数组 哈希表 排序 👍 1001 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    //解法1：排序后两两进行比较
    /*public int findRepeatNumber(int[] nums) {
        Arrays.sort(nums);
        for (int i = 1; i < nums.length; i++) {
            if (nums[i]==nums[i-1])
                return nums[i];
        }
        return -1;
    }*/

    //解法2：利用set的不重复性
    /*public int findRepeatNumber(int[] nums) {
        HashSet<Integer> set =new HashSet<>();
        for (int num : nums) {
            if(set.contains(num)) return num;
            set.add(num);
        }
        return -1;
    }*/

    //解法3：题目说明数组 nums 里的所有数字都在 0～n-1 的范围内，所以该数组存在索引和值的1对多关系
    //通过交换使索引和值一一对应，找到重复的值
    public int findRepeatNumber(int[] nums) {
        int i = 0;
        while (i < nums.length){
            if (nums[i] == i) {
                i++;
                continue;
            }
            if (nums[nums[i]] == nums[i]) return nums[i];

            int tmp = nums[i];
            nums[i] = nums[tmp];
            nums[tmp] = tmp;
        }
        return -1;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
